kotlin协程在android的应用
- 可以让View层继承
CoroutineScope by MainScope
,就可以直接使用launch
调用协程1
2
3
4
5
6
7abstract class BaseFragment:Fragment() ,CoroutineScope by MainScope(){
fun xxx(){
launch{
//...业务逻辑,默认在主线程执行
}
}
} - 如果使用了ViewModle的话,可以在vm内直接使用
viewModelScope.launch { }
开启协程,也是在主线程内执行。 - 那么协程是怎么协的呢,举个栗子,retrofit网络请求,可以这样(注意这是举个栗子,实际开发用retrofit一般不会这么做,返回要么是Call,要么是Response,要么是Rxjava的Observable,否则服务端给个响应码404就异常了,捕获异常也只能拿到异常信息 ,拿不到errorBody中的信息)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15interface Api{
@GET("xxx/xxx")
suspend fun getData(): BaseDTO<*>
}
suspend fun getData() : BaseDTO<*> = withContext(Dispatchers.IO){
Retrofit.Builder().baseUrl("").build().create(Api::class.java).getData()
}
fun test(){
launch {
val data = getData() // getData是个suspend方法,withContext指定了运行在IO线程池
refeshUI(data)// 回到launch下面,这里是运行在主线程的,可以拿到data后刷新UI
}
}
3.如果suspend不能直接返回结果呢,比如回调的时候怎么办?还是用retrofit举栗子
1 | interface Api{ |
协程的优势就是可以直接在一个花括号内,像写同步代码一样写异步代码,线程协作运行。一些不必要的LiveData、EventBus、Handler之类跳来跳去的通知可以省去了。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 七夜的小屋!